给mBlock添加扩展模块 您所在的位置:网站首页 mblock app下载 给mBlock添加扩展模块

给mBlock添加扩展模块

2023-09-19 00:38| 来源: 网络整理| 查看: 265

1.mblock简介

mblock是基于开源软件Scratch开发的图形化编程软件,支持Makeblock机器人和Arduino编程,从而让用户可以轻易创造出可交互的智能应用。关于mblock请查看官网:http://www.mblock.cc/

2.关于mblock扩展

在使用mblock编写arduino程序时,有些arduino功能mblock并没有提供,这就需要自行编写mblock扩展,为mblock添加新的语句块,丰富mblock对arduino硬件的控制功能。关于mblock扩展的编写,请参考mblock官网提供的教程:http://www.mblock.cc/zh-home/docs/mblock-extension-center-cn/?noredirect=zh_CN

3.编写一个mblock扩展

在mblcok提供的官方扩展教程中提到,mblock语句都有两个模式Scratch模式和Arduino模式。Scratch模式是在线模式,Arduino控制板必修一直连接电脑才可以。Arduino模式下,程序被烧写到Arduino控制板中,arduino脱离电脑自行运行。因此Scratch称为在线模式,Arduino称为离线模式。 在mblock提供的扩展demo示例中,一个mblock扩展一般包括三个部分,xxx.s2e,js文件夹,src文件夹;其中xxx.s2e文件是每个扩展必须实现的文件,js文件夹中是Scratch模式下的Javascript文件xxx.js,src文件夹中是额外的C程序文件。如果要实现Scratch模式,则xxx.js文件必须实现,如果不需要Scratch模式,则xxx.js文件不必实现。

共阴8段数码管只实现Arduino模式,因此xxx.js不用实现,只编写xxx.s2e即可,同时实现控制LED显示数字的C程序。该实现是在mblock提供的扩展demo的基础上修改而来。整个扩展包好demo.s2e文件和src文件夹,其中src文件夹中是demo.cpp文件和demo.h文件。

demo.s2e文件的内容: { "extensionName": "LED_DEMO", //扩展名称 "sort":0, //扩展在mBlock中展示次序 "javascriptURL":"js/demo.js", //指定javascript文件的路径 "extensionPort":0, //扩展使用的网络端口,0表示使用串口 "firmware":"1.0", //在线控制的固件版本号 "blockSpecs": [ ["h","Demo Program","runArduino"], [ "w", "led8_init( %n , %n , %n , %n , %n , %n , %n )", "led8_init", "2", "3", "4", "5", "6", "7", "8", { "setup":"", "inc":"#include \"demo.h\"", "def":"DemoClass demo; \n", "work":"demo.led8_init({0},{1},{2},{3},{4},{5},{6}); \n", "loop":"" } ], [ "w", "led8_display( %n )", "led8_display", "0", { "setup":"", "inc":"#include \"demo.h\"", "def":"DemoClass demo; \n", "work":"demo.led8_display({0}); \n", "loop":"" } ], ], "translators":{ "zh_CN":{ "Demo Program":"演示程序", "led8_init( %n , %n , %n , %n , %n , %n , %n )":"共阴数码管初始化( %n , %n , %n , %n , %n , %n , %n )", "led8_display( %n )":"数码管显示( %n )" } } }

在编写demo.s2e文件时需要注意: 1.由于本功能没有实现Scratch模式,因此"javascriptURL":""字段要设置为空,否则会报错。 2.led8_init函数指定8段数码管引脚使用的Arduino数字引脚,这里8段数码管的引脚ag接到arduino的数字28口,led8_init( %n , %n , %n , %n , %n , %n , %n )写的时候,%n前后都有一个空格,否则在mblock中该函数会参数会显示不完整。 3.led8_init函数和led_display函数都是在src文件夹中的demo.cpp中实现的函数 4.“work”:“demo.led8_init({0},{1},{2},{3},{4},{5},{6}); \n”,意思是调用demo对象中的led8_init函数。 5."translators"字段中是把函数名称转换成中文显示在mblock中。

demo.h头文件内容 #ifndef demo_h #define demo_h #include ///@brief Class for DemoClass class DemoClass { public: DemoClass(); void led8_init(int a,int b,int c,int d,int e,int f, int g); //8段LED数码管初始化函数 void led8_display(int num); //显示数值num,num取值0~9 private: int SEG_a,SEG_b,SEG_c,SEG_d,SEG_e,SEG_f,SEG_g; //共阴数码管的真值表 unsigned char table[10][8]= { {0,0,1,1,1,1,1,1},//0 {0,0,0,0,0,1,1,0},// 1 {0,1,0,1,1,0,1,1},// 2 {0,1,0,0,1,1,1,1},// 3 {0,1,1,0,0,1,1,0},// 4 {0,1,1,0,1,1,0,1},// 5 {0,1,1,1,1,1,0,1},// 6 {0,0,0,0,0,1,1,1},// 7 {0,1,1,1,1,1,1,1},// 8 {0,1,1,0,1,1,1,1},// 9 }; }; #endif demo.cpp文件内容 #include "demo.h" DemoClass::DemoClass(){ pinMode(13,OUTPUT); } void DemoClass::led8_init(int a, int b, int c, int d, int e, int f, int g) { SEG_a=a; SEG_b=b; SEG_c=c; SEG_d=d; SEG_e=e; SEG_f=f; SEG_g=g; pinMode(SEG_a,OUTPUT); pinMode(SEG_b,OUTPUT); pinMode(SEG_c,OUTPUT); pinMode(SEG_d,OUTPUT); pinMode(SEG_e,OUTPUT); pinMode(SEG_f,OUTPUT); pinMode(SEG_g,OUTPUT); } void DemoClass::led8_display(int num) { digitalWrite(SEG_a,table[num][7]); digitalWrite(SEG_b,table[num][6]); digitalWrite(SEG_c,table[num][5]); digitalWrite(SEG_d,table[num][4]); digitalWrite(SEG_e,table[num][3]); digitalWrite(SEG_f,table[num][2]); digitalWrite(SEG_g,table[num][1]); } demo.js 文件为空文件

如果不加这个文件将导入不进去。

把该扩展导入到mblock中,然后在mblock的扩展菜单选中“Seg_LED”,在mblock的机器人模块中就会出现Sed_LED扩展模块,显示出“共阴数码管初始化”和“数码管显示”两个语句,

编写测试程序,如图1所示,数码管显示正常。 在这里插入图片描述 本博客程序下载地址:https://download.csdn.net/download/qq_27251141/11154279



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有